package com.heima.heima_netty.nio.c3;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.List;

import static com.heima.heima_netty.nio.c1.ByteBufferUtil.*;

/**
 * @author felix
 * @date 2024/9/10 14:54
 *
 * 0. accept和read是两个阻塞方法
 * 1. 运行到accept方法处线程停止，接受到新的连接请求后继续向下运行
 * 2. 运行到read方法处线程停止，若缓冲区中含有数据则继续向下运行
 * 3. 创建实例时默认配置为阻塞，修改为非阻塞
 * 4. CPU处于轮询状态，消耗巨大
 */
@Slf4j
public class Server1 {
    public static void main(String[] args) throws IOException {
        // 0.分配内存
        ByteBuffer buffer = ByteBuffer.allocate(10);

        // 1. 创建服务器实例
        ServerSocketChannel ssc = ServerSocketChannel.open();

        ssc.configureBlocking(false);

        // 2. 绑定监听端口
        ssc.bind(new InetSocketAddress(8089));

        // 3. 连接集合
        List<SocketChannel> channels = Lists.newArrayList();
        while (true){
            // 4. 与客户端建立连接 使用SocketChannel数据通信
            SocketChannel sc = ssc.accept(); // 连接未建立时sc为null
            if (sc != null){
                sc.configureBlocking(false);
                channels.add(sc);
            }
            for (SocketChannel channel : channels){
                int read = channel.read(buffer);//若未读到数据，read为0
                if(read>0){
                    buffer.flip();
                    debugRead(buffer);
                    buffer.clear();
                }
            }
        }
    }
}
